/**
 * Copyright (c) 2008 Luciano Bustos - riaevolution.com, All Rights Reserved.
 *
 * Contact luchyx@riaevolution.com
 * See www.riaevolution.com
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
 * of the Software, and to permit persons to whom the Software is furnished to do
 * so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 * */

package com.riaevolution.components {
	import flash.display.DisplayObject;
	import flash.display.Sprite;
	import flash.events.KeyboardEvent;
	import flash.ui.Keyboard;

	import mx.containers.TitleWindow;
	import mx.core.Application;
	import mx.core.UIComponent;
	import mx.events.CloseEvent;
	import mx.managers.PopUpManager;

	/**
	 * Mimic the prompt function on javascript but provide you a way to specify an UIcomponente for user prompt.
	 * <listing>
	 * var form:PasswordReminderForm = new PasswordReminderForm();
	 * ModalPromptHandler.show ("Password recovery", form,my_close_handler_function, true);
	 * </listing>
	 *
	 * <br /><b>Luciano bustos</b> <a href="mailto:luchyx&#64;riaevolution.com">luchyx&#64;riaevolution.com</a><br /><a href="http://www.riaevolution.com">www.riaevolution.com</a>
	 */
	public class ModalPromptHandler extends TitleWindow {

		/**
		 * The unique prompt handler instance.
		 */
		private static var _instance:ModalPromptHandler;

		public function ModalPromptHandler() {
			super();
			addEventListener(KeyboardEvent.KEY_UP, handle_KeyBoardEvent, true);
		}

		/**
		 * Enroute the key escape event and dispatch a close event.
		 * @param event
		 */
		private function handle_KeyBoardEvent(event:KeyboardEvent):void {
			if (event.keyCode == Keyboard.ESCAPE) {
				dispatchEvent(new CloseEvent(CloseEvent.CLOSE));
			}
		}

		/**
		 * Internal prompt-handler.
		 * @param event
		 *
		 */
		override protected function keyUpHandler(event:KeyboardEvent):void {
			super.keyUpHandler(event);
			handle_KeyBoardEvent(event);
		}

		//STATIC functions
		/**
		 * Singleton for this class. You don't need to call this method directly. Use instead show.
		 * @return
		 * @see show
		 */
		private static function getInstance():ModalPromptHandler {
			if (!_instance) {
				_instance = new ModalPromptHandler();
			}
			return _instance;
		}
		private var instanceAdded:Boolean = false;

		/**
		 * Display the prompt handler panel.
		 *
		 *
		 * @param title Current title for the title bar
		 * @param innerUI The inner UI componente that is displayed inside the prompt default.
		 * @param closeHandler The close_HandleFunction that listen for close events.
		 * @param modal If the PromptHandler block user interaction with other UI's.
		 * @param closeButton show/hide the close button
		 * @param parent the parent display objet.
		 * @return ModalPromptHandler UI componente
		 *
		 */
		public static function show(title:String = '', innerUI:DisplayObject = null, closeHandler:Function = null, modal:Boolean = true, closeButton:Boolean = true, parent:Sprite = null):ModalPromptHandler {
			if (!parent)
				parent = Sprite(Application.application);
			var ins:ModalPromptHandler = getInstance();
			if (innerUI) {
				ins.addChild(innerUI);
				if (UIComponent(innerUI)) {
					UIComponent(innerUI).setFocus();
				}
			}
			if (closeHandler != null) {
				ins.removeEventListener(CloseEvent.CLOSE, closeHandler);
				ins.addEventListener(CloseEvent.CLOSE, closeHandler);
			}
			ins.title = title;
			ins.showCloseButton = closeButton;
			if (!ins.instanceAdded) {
				//don't add it again.
				PopUpManager.addPopUp(ins, parent, modal);
				ins.instanceAdded = true;
			}
			PopUpManager.centerPopUp(ins);
			return ins;
		}

		/**
		 * Hide remove the promp window from the display list.
		 * Also clear all childrens.
		 **/
		public static function hide():void {
			if (_instance) {
				_instance.removeAllChildren();
				PopUpManager.removePopUp(_instance);
				_instance.instanceAdded = false;
				_instance = null;
			}
		}

		/**
		 * Return the current instance displayed by the modal window.
		 **/
		public static function currentUI():DisplayObject {
			return _instance.getChildAt(0);
		}

		/**
		 * Replace the current displaying UIcomponent with the desired new component.
		 **/
		public static function replace(innerUI:DisplayObject):void {
			_instance.removeAllChildren();
			_instance.addChild(innerUI);
			PopUpManager.centerPopUp(_instance);
		}
	}
}